package encoding;

import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * 演示响应编码
 */
public class ResponseEncoding extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        write7(req, resp);
    }

    /**
     * 直接写入响应
     * 1. Tomcat 默认编码是 ISO-8859-1，该编码不支持中文
     * 2. 浏览器一般默认使用 GBK 编码，所以肯定会乱码
     */
    public void write1(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter();
        writer.println("直接写入");
    }


    /**
     * 因为已经设置了字符流编码为utf-8，所以响应给客户端的数据为utf-8编码！
     * 但因为浏览器默认使用的是gbk来解析响应数据，所以乱码！如果浏览器使用utf-8编码，那么就不会乱码了。
     */
    public void write2(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("utf-8");
        resp.getWriter().println("设置字符流编码为utf-8");
    }

    /**
     * 因为设置了字符流编码为gbk，所以响应给客户端的数据为gbk编码！
     * 因为浏览器默认使用gbk来解析数据，所以不会出现乱码！如果浏览器使用utf-8编码，那么就会出现乱码！
     */
    public void write3(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("gbk");
        resp.getWriter().println("设置字符流编码为gbk");
    }

    /**
     * 设置字符流编码
     * 等同于调用了response.setCharacterEncoding("utf-8")；
     * 设置Content-type响应头，即通知浏览器响应数据的编码为utf-8。
     */
    public void write4(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        resp.getWriter().println("调用了setContentType，设置编码为utf-8");
    }

    /**
     * 演示同上，不过修改了编码为gbk
     */
    public void write5(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=gbk");
        resp.getWriter().println("调用了setContentType，设置编码为gbk");
    }

    /**
     * 调用 resp.setHeader 方法，通知浏览器正确的解码方式
     */
    public void write6(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 字符流使用utf-8
        resp.setCharacterEncoding("utf-8");
        resp.getWriter().printf("这句话是使用utf-8编码写入的");
        // 通知浏览器使用utf-8解码
        resp.setHeader("Content-Type", "text/html;charset=utf-8");
    }

    /**
     * 直接写入字节数组
     */
    public void write7(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getOutputStream().write("这是通过gbk编码得到的字节数组直接写入得到的".getBytes("gbk"));
    }
}
